洛谷题解洛谷题解题解:B3968 [GESP202403 五级] 成绩排序
xyx404
思路:
使用结构体快排,自己写判断函数,按照题目给出的进行判断,判断后历遍一次结构体数组,把学生的排名赋值,然后按照输入的顺序再排序一次最后输出就可以了。
如何赋值排名,如果和上一个人的排名是相同的就赋值为上一个人的排名,如果不是直接赋值为 i。
代码:
#include<bits/stdc++.h> using namespace std; int n; struct node{ long long sum,chinese,math,english; long long pm,bh; }stud[10002]; bool cmp(node x,node y){ if(x.sum!=y.sum)return x.sum>y.sum; else{ if(x.chinese+x.math!=y.chinese+y.math)return x.chinese+x.math>y.chinese+y.math; else{ if(max(x.chinese,x.math)!=max(y.chinese,y.math))return max(x.chinese,x.math)>max(y.chinese,y.math); else{ return 0; } } } } bool cmp1(node x,node y){ return x.bh<y.bh; } int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>stud[i].chinese>>stud[i].math>>stud[i].english,stud[i].sum=stud[i].chinese+stud[i].math+stud[i].english,stud[i].bh=i; sort(stud+1,stud+1+n,cmp); int cnt=1; for(int i=1;i<=n;i++){ if(stud[i].sum==stud[i-1].sum &&stud[i].chinese+stud[i].math==stud[i-1].chinese+stud[i-1].math &&max(stud[i].chinese,stud[i].math)==max(stud[i-1].chinese,stud[i-1].math)){ stud[i].pm=cnt; } else{ cnt=i; stud[i].pm=cnt; } } sort(stud+1,stud+1+n,cmp1); for(int i=1;i<=n;i++)cout<<stud[i].pm<<"\n"; return 0; }
|